package com.redis;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * @Description:演示redis主要的功能类
 * @author huangjd
 * @date 2018年4月19日
 */
public class RedisClient {
	
	private Jedis jedis;//非切片额客户端连接（非切片额:非分布式，切片即分布式）
	private JedisPool jedisPool;//非切片连接池
	private ShardedJedis shardedJedis;//切片额客户端连接
	private ShardedJedisPool shardedJedisPool;//切片连接池
	
	/**
	 * 构造函数，执行初始化操作
	 */
	public RedisClient(){
		initialPool();
		initialShardedPool();
		jedis = jedisPool.getResource();
		shardedJedis = shardedJedisPool.getResource();
	}
	
	/**
	 * 初始化非切片池
	 */
	private void initialPool(){
		//池基本配置
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(5);//连接池的最大等待（最大空闲）连接的数量，设0表示没有限制
		config.setMaxTotal(20);//连接池的最大数据库连接数，设0表示没有限制
		config.setMaxWaitMillis(10001);//最大等待毫秒数，单位是ms，超过时间会提示错误信息
		config.setTestOnBorrow(false);//是否对拿到的connection进行validateObject校验
		
		jedisPool = new JedisPool(config,"127.0.0.1",6379);
	}
	
	/**
	 * 初始化切片池
	 */
	private void initialShardedPool(){
		//池基本配置
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(20);
		config.setMaxIdle(5);
		config.setMaxWaitMillis(10001);
		config.setTestOnBorrow(false);
		//slave链接
		List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();//JedisShardInfo里面包含了jedis服务器的一些信息，如名称、权重等
		shards.add(new JedisShardInfo("127.0.0.1",6379,"master"));
		
		//构造池
		shardedJedisPool = new ShardedJedisPool(config,shards);
	}
	
	public void show(){
		KeyOperate();
	}
	
	/**
	 * key键操作函数
	 */
	private void KeyOperate(){
		System.out.println("===========================key========================");
		//清空数据
		System.out.println("清空库中所有数据："+jedis.flushDB());
		//判断key是否存在
		System.out.println("判断key999键是否存在："+shardedJedis.exists("key999"));
		System.out.println("新增key001,value001键值对："+shardedJedis.set("key001", "value001"));
		System.out.println("判断key001是否存在："+shardedJedis.exists("key001"));
		//输出系统中的所有key
		System.out.println("新增key002,value002键值对："+shardedJedis.set("key002", "value002"));
		System.out.println("系统中所有键如下：");
		Set<String> keys = jedis.keys("*");
		Iterator<String> it = keys.iterator();
		while(it.hasNext()){
			String key = it.next();
			System.out.println(key);
		}
		//删除某个key，若key不存在，则忽略该命令
		System.out.println("系统中删除key002:"+jedis.del("key002"));
		System.out.println("判断key002,是否存在："+shardedJedis.exists("key002"));
		//设置key001的过期时间
		System.out.println("设置key001的过期时间为5秒："+jedis.expire("key001", 5));
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//查看某个key的剩余生存时间，单位【秒】，永久生存或者不存在的都返回-1
		System.out.println("查看key001的剩余生存时间："+jedis.ttl("key001"));
		//移除某个key的生存时间
		System.out.println("移除key001的生存时间："+jedis.persist("key001"));
		System.out.println("查看key001的剩余生存时间："+jedis.ttl("key001"));
		//查看key所储存的值的类型
		System.out.println("查看key所储存的值的类型："+jedis.type("key001"));
		
		/**
		 * 一些其他方法：
		 * 	1、修改键名：jedis.rename("key6","key0");
		 * 	2、将当前db的key移动到给定的db当中：jedis.move("foo",1);
		 */
	}
	
	
	
	
	
	
	
	
	
}
